Computers include various components, such as a central processing unit (CPU), memory, mass storage, and so forth. As software applications executable in such computers have become more powerful, the demands placed by such software applications on computing resources, such as memory capacity, have also increased.
Typically, a memory subsystem within a computer is made up of memory modules inserted into one or more memory sockets or slots that are arranged either on a main board or a peripheral board in the computer. Memory devices used in such memory modules are prone to errors, including soft errors and hard errors. Soft errors are temporary errors caused by alpha articles impacting solid state circuitry within the memory devices. Hard errors are caused by physical defects in the memory device, such as a short circuit or open circuit.
One technique for addressing errors in a memory device is to use an error code correction (ECC) mechanism, which uses check bits stored in the memory device to enable the detection and correction of certain types of errors. Typically, ECC protection provides correction of single-bit errors and detection (without correction) of multi-bit errors. Another technique for addressing errors in a memory subsystem is the use of mirroring to provide redundancy for data stored in the memory subsystem. With mirroring, a memory subsystem is essentially divided into two halves, with a first half used for storing information such as software instructions and system and/or user data, and a second half for storing a copy of the information in the first half. Basically, the second half of the memory subsystem is allocated to store redundant information. In case of failure of any portion of the first half of the memory subsystem, the content of the second half of the memory subsystem can be accessed to provide the requested data.
In a typical implementation, the data in both “halves” of the memory subsystem are kept identical. Memory writes are directed to both “halves” of the memory subsystem to provide coherency. Memory reads are serviced by only one half of the memory subsystem. If that memory half incurs a memory failure the memory read will automatically be retried to the other half that does not contain the failure. This results in a system that is protected against multi-bit errors that would otherwise result in a system failure.
However, an issue associated with the use of memory mirroring is that a substantial portion (half) of the memory subsystem is made unavailable for storage of non-redundant information. In other words, half of the installed physical memory is utilized for redundancy, resulting in only half of the memory being available for use by the operating system. As a result, memory resources are reduced, which may reduce system performance.